package com.example.demo8;

import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class PlayerModule extends HBox {
    private final String playerName;
    private final List<Pane> heroAvatars = new ArrayList<>();
    private final List<Hero> heroes = new ArrayList<>();
    private Pane selectedAvatar = null;
    private StackPane detailContainer; // 详情容器（根容器）
    private ImageView fullArtView; // 立绘显示组件
    private Label descLabel; // 新增：描述文字标签
    private VBox detailContent; // 新增：立绘+描述的垂直容器

    public PlayerModule(String playerName) {
        this.playerName = playerName;
        this.setSpacing(20);
        this.setPadding(new Insets(10));

        loadHeroData();
        VBox candidateBox = createCandidateBox();
        detailContainer = createDetailContainer(); // 创建详情容器
        resetDetailView(); // 初始化详情区域
        this.getChildren().addAll(candidateBox, detailContainer);
    }

    // 加载英雄数据
    private void loadHeroData() {
        heroes.add(new Hero(
                "丛雨",
                "/Hero/Avatar/丛雨.png",
                "/Hero/Full/丛雨.png",
                "守护穗织镇的“神刀·丛雨丸”付丧神，活了近500年的狐耳巫女。性格温柔端庄，对现代事物充满好奇，战斗时挥舞巨大神刀，拥有封印妖物的力量。"
        ));
        heroes.add(new Hero(
                "小春",
                "/Hero/Avatar/小春.png",
                "/Hero/Full/小春.jpg",
                "主角的同班同学，活力满满的元气少女。喜欢摄影，经常来穗织镇采风，性格开朗自来熟，是团队中的“气氛担当”。"
        ));
        heroes.add(new Hero(
                "芦花",
                "/Hero/Avatar/芦花.jpg",
                "/Hero/Full/芦花.jpg",
                "穗织镇“青梅馆”温泉旅馆的老板娘，主角的义姐。性格温柔包容，厨艺精湛，表面普通人类，实则与妖物有着不为人知的联系。"
        ));
        heroes.add(new Hero(
                "朝武芳乃",
                "/Hero/Avatar/芳乃.jpg",
                "/Hero/Full/朝武芳乃.jpg",
                "穗织镇名家“朝武家”的大小姐，神社的巫女继承人。外表高冷傲娇，实则内心细腻，擅长剑术和神社仪式，肩负守护镇子的重任。"
        ));
        heroes.add(new Hero(
                "茉子",
                "/Hero/Avatar/茉子.png",
                "/Hero/Full/茉子.jpg",
                "芳乃的护卫兼青梅竹马，朝武家的分家女儿。性格直率贪吃，力气很大，使用薙刀战斗，对芳乃极其忠诚，梦想是成为“最强女仆”。"
        ));
        heroes.add(new Hero(
                "蕾娜",
                "/Hero/Avatar/蕾娜.jpg",
                "/Hero/Full/蕾娜.jpg",
                "来自欧洲的金发留学生，好奇心旺盛的“西洋巫女”。擅长使用符文魔法，性格开朗乐观，经常说出让人意外的日式冷笑话，手持家族传承的魔导书。"
        ));
    }

    private VBox createCandidateBox() {
        VBox candidateBox = new VBox();
        candidateBox.setSpacing(15);
        candidateBox.setPadding(new Insets(10));
        candidateBox.setPrefWidth(350);
        candidateBox.setStyle("-fx-background-color: rgba(255, 255, 255, 0.8);"); // 半透明白色背景

        Label candidateTitle = new Label(playerName + "候选英雄");
        candidateTitle.setFont(Font.font("微软雅黑", FontWeight.BOLD, 20));
        candidateTitle.setTextFill(Color.DARKSLATEGRAY);

        GridPane heroGrid = createHeroGrid();
        Button selectBtn = createSelectButton();

        candidateBox.getChildren().addAll(candidateTitle, heroGrid, selectBtn);
        return candidateBox;
    }

    private GridPane createHeroGrid() {
        GridPane heroGrid = new GridPane();
        heroGrid.setHgap(15);
        heroGrid.setVgap(15);
        heroGrid.setPadding(new Insets(10, 0, 10, 0));

        ColumnConstraints col1 = new ColumnConstraints(160);
        ColumnConstraints col2 = new ColumnConstraints(160);
        heroGrid.getColumnConstraints().addAll(col1, col2);

        RowConstraints row1 = new RowConstraints(160);
        RowConstraints row2 = new RowConstraints(160);
        RowConstraints row3 = new RowConstraints(160);
        heroGrid.getRowConstraints().addAll(row1, row2, row3);

        for (int i = 0; i < heroes.size(); i++) {
            int row = i / 2;
            int col = i % 2;
            Hero hero = heroes.get(i);
            Pane avatar = createHeroAvatar(hero);
            heroGrid.add(avatar, col, row);
            heroAvatars.add(avatar);
        }

        return heroGrid;
    }

    private Pane createHeroAvatar(Hero hero) {
        Pane avatar = new Pane();
        avatar.setPrefSize(160, 160); // 固定方框尺寸 160x160
        avatar.setUserData(hero);

        // 加载头像图片（带错误处理）
        String avatarPath = hero.getAvatarPath();
        URL avatarResource = getClass().getResource(avatarPath);
        Image avatarImage;
        if (avatarResource == null) {
            System.err.println("❌ 头像资源不存在: " + avatarPath);
            avatarImage = new Image(getClass().getResourceAsStream("/Hero/Avatar/default.png"));
        } else {
            avatarImage = new Image(avatarResource.toExternalForm());
        }

        ImageView avatarImg = new ImageView(avatarImage);
        // ==============================================================
        // 核心修改：对小春和朝武芳乃特殊处理，强制填满方框（消除白边）
        // ==============================================================
        String heroName = hero.getName();
        if ("小春".equals(heroName) || "朝武芳乃".equals(heroName)) {
            // 方式：关闭比例保持，强制拉伸填满 160x160 方框（无白边）
            avatarImg.setPreserveRatio(false); // 关闭比例保持（关键）
            avatarImg.setFitWidth(160);       // 宽度强制160
            avatarImg.setFitHeight(160);      // 高度强制160
        } else {
            // 其他角色：保持原比例（避免变形），居中显示（原逻辑）
            avatarImg.setPreserveRatio(true);
            avatarImg.setFitWidth(160);
            avatarImg.setFitHeight(160);
        }
        // ==============================================================
        avatar.getChildren().add(avatarImg);

        // 英雄名称标签（原代码不变）
        Label nameLabel = new Label(hero.getName());
        nameLabel.setFont(Font.font("微软雅黑", FontWeight.BOLD, 14));
        nameLabel.setTextFill(Color.WHITE);
        nameLabel.setPadding(new Insets(5));
        nameLabel.setStyle("-fx-background-color: rgba(0,0,0,0.5);");
        StackPane nameContainer = new StackPane(nameLabel);
        nameContainer.setPrefSize(160, 30);
        nameContainer.setLayoutY(130);
        avatar.getChildren().add(nameContainer);

        // 边框样式（原代码不变）
        avatar.setBorder(new Border(new BorderStroke(
                Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(2)
        )));

        // 鼠标交互（原代码不变）
        avatar.setOnMouseEntered(e -> {
            if (avatar != selectedAvatar) {
                avatar.setBorder(new Border(new BorderStroke(
                        Color.ORANGE, BorderStrokeStyle.SOLID, null, new BorderWidths(2)
                )));
            }
        });
        avatar.setOnMouseExited(e -> {
            if (avatar != selectedAvatar) {
                avatar.setBorder(new Border(new BorderStroke(
                        Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(2)
                )));
            }
        });
        avatar.setOnMouseClicked(e -> {
            Hero selectedHero = (Hero) avatar.getUserData();
            if (avatar == selectedAvatar) {
                avatar.setBorder(new Border(new BorderStroke(
                        Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(2)
                )));
                selectedAvatar = null;
                resetDetailView();
            } else {
                if (selectedAvatar != null) {
                    selectedAvatar.setBorder(new Border(new BorderStroke(
                            Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(2)
                    )));
                }
                avatar.setBorder(new Border(new BorderStroke(
                        Color.ORANGE, BorderStrokeStyle.SOLID, null, new BorderWidths(3)
                )));
                selectedAvatar = avatar;
                updateDetailView(selectedHero);
            }
        });

        return avatar;
    }

    private Button createSelectButton() {
        Button selectBtn = new Button("选择英雄");
        selectBtn.setPrefWidth(335);
        selectBtn.setPrefHeight(40);
        selectBtn.setFont(Font.font("微软雅黑", FontWeight.BOLD, 16));
        selectBtn.setStyle(
                "-fx-background-color: #1E90FF; " +
                        "-fx-text-fill: white; " +
                        "-fx-cursor: hand; " +
                        "-fx-border-radius: 5px;"
        );

        selectBtn.setOnAction(e -> {
            if (selectedAvatar == null) {
                Alert alert = new Alert(Alert.AlertType.WARNING);
                alert.setTitle("提示");
                alert.setHeaderText(null);
                alert.setContentText(playerName + "请先选择一个英雄！");
                alert.showAndWait();
            } else {
                Hero selectedHero = (Hero) selectedAvatar.getUserData();
                Alert alert = new Alert(Alert.AlertType.INFORMATION);
                alert.setTitle("提示");
                alert.setHeaderText(null);
                alert.setContentText(playerName + "选择了英雄：" + selectedHero.getName());
                alert.showAndWait();
            }
        });

        return selectBtn;
    }

    // 创建详情容器（包含立绘+描述的垂直布局）
    private StackPane createDetailContainer() {
        StackPane container = new StackPane();
        container.setPrefSize(300, 500); // 宽度300，高度500（足够容纳立绘+文字）
        container.setBorder(new Border(new BorderStroke(
                Color.BLACK, BorderStrokeStyle.SOLID, null, new BorderWidths(2)
        )));
        container.setBackground(new Background(new BackgroundFill(
                Color.WHITESMOKE, null, null
        )));

        // 1. 立绘控件（调整高度，留出描述空间）
        fullArtView = new ImageView();
        fullArtView.setPreserveRatio(true);
        fullArtView.setFitHeight(300); // 立绘高度300px（原500px）
        fullArtView.setVisible(false);

        // 2. 描述文字标签（位于立绘下方）
        descLabel = new Label();
        descLabel.setFont(Font.font("微软雅黑", 14)); // 字体大小14px
        descLabel.setTextFill(Color.BLACK); // 文字颜色黑色
        descLabel.setWrapText(true); // 自动换行
        descLabel.setMaxWidth(280); // 最大宽度（略小于容器宽度，留边距）
        descLabel.setPadding(new Insets(10)); // 内边距
        descLabel.setVisible(false);

        // 3. 垂直容器（立绘在上，描述在下）
        detailContent = new VBox(10); // 立绘和描述间距10px
        detailContent.setAlignment(Pos.TOP_CENTER); // 顶部居中对齐
        detailContent.getChildren().addAll(fullArtView, descLabel); // 添加立绘和描述

        // 将垂直容器添加到详情容器
        container.getChildren().add(detailContent);

        return container;
    }

    // 重置详情区域（显示初始提示文字）
    private void resetDetailView() {
        // 隐藏立绘和描述
        fullArtView.setVisible(false);
        descLabel.setVisible(false);

        // 显示初始提示文字
        Label placeholder = new Label(playerName + "英雄详情\n（选中英雄后显示信息）");
        placeholder.setFont(Font.font("微软雅黑", FontWeight.BOLD, 18));
        placeholder.setTextFill(Color.GRAY);
        placeholder.setWrapText(true);
        placeholder.setAlignment(Pos.CENTER);
        StackPane.setMargin(placeholder, new Insets(20));

        // 清除原有内容，添加提示文字
        detailContent.getChildren().clear();
        detailContent.getChildren().add(placeholder);
    }

    // 更新详情区域（显示立绘+描述）
    private void updateDetailView(Hero hero) {
        // 1. 加载立绘图片
        String fullArtPath = hero.getFullImagePath();
        URL fullArtResource = getClass().getResource(fullArtPath);
        Image fullImage;
        if (fullArtResource == null) {
            System.err.println("❌ 立绘资源不存在: " + fullArtPath);
            fullImage = new Image(getClass().getResourceAsStream("/Hero/Full/default.jpg")); // 默认立绘
        } else {
            fullImage = new Image(fullArtResource.toExternalForm());
        }
        fullArtView.setImage(fullImage);
        fullArtView.setVisible(true);

        // 2. 设置描述文字（格式：【名称】+描述）
        descLabel.setText("【" + hero.getName() + "】\n\n" + hero.getDescription());
        descLabel.setVisible(true);

        // 3. 更新详情内容（显示立绘+描述，移除初始提示）
        detailContent.getChildren().clear();
        detailContent.getChildren().addAll(fullArtView, descLabel);
    }
}